package com.example.modelandview;

import static com.example.modelandview.BallView.PI;

import java.util.Random;

public class Ball {
    private Random random = new Random();
    /**
     * x,y分别为小球在坐标轴上的X轴和Y轴的坐标值
     * radius为小球的半径值
     * 这些是小球的基本属性
     */
    float x = 150+random.nextFloat();
    float y = 170+random.nextFloat();
    int radius = random.nextInt(50)+20;
    /**
     * 使得小球动起来需要具备两个条件
     * 需要有方向矢量
     * 这里使用的是极坐标系的两个参数
     * 也可以考虑换成笛卡尔直角坐标系
     */
    int speed = 20;
    double angle = (random.nextFloat()) * 2 * PI;


    public Ball() {
    }

    public Ball(float x, float y, int r) {
        this.x = x;
        this.y = y;
        radius = r;
    }

    /**
     * 利用三角函数计算出球的新位置值
     * 当与边界发生碰撞时->改变球的角度
     */
    public void updateLocate() {
        x = x + (float) (speed * Math.cos(angle));
        //Log.v(TAG, Math.cos(angle)+"");
        y = y + (float) (speed * Math.sin(angle));
        //Log.v(TAG, Math.cos(angle)+"");

        //横向距离超过宽度
        if ((x + radius) >= BallView.WIDTH) {
            if (angle >= 0 && angle <= (PI / 2))
                angle = PI - angle;
            if (angle > 1.5 * PI && angle <= 2 * PI)
                angle = 3 * PI - angle;
        }

        // 移动的x距离不足半径
        if (x - radius <= 0) {
            if (angle >= PI && angle <= 1.5 * PI)
                angle = 3 * PI - angle;
            if (angle >= PI / 2 && angle < PI)
                angle = PI - angle;
        }

        // 移动的y距离不足半径 || 纵向距离超过高度
        if (y - radius <= 0 || y + radius >= BallView.HEIGHT)
            angle = 2 * PI - angle;
    }

    /**
     * 该变两球的角度，用于处理两球的碰撞
     * 改变两球的方向的方法是直接交换两球的方向角
     * @param other
     */
    public void changeDerection(Ball other) {
        double temp = this.angle;
        this.angle = other.angle;
        other.angle = temp;
    }

    public float getX() {
        return x;
    }

    public void setX(float x) {
        this.x = x;
    }

    public float getY() {
        return y;
    }

    public void setY(float y) {
        this.y = y;
    }

    public double getAngle() {
        return angle;
    }

    public void setAngle(double angle) {
        this.angle = angle;
    }

    public int getSpeed() {
        return speed;
    }

    public void setSpeed(int speed) {
        this.speed = speed;
    }

    public int getRadius() {
        return radius;
    }

    public void setRadius(int radius) {
        this.radius = radius;
    }
}
